﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Security.Services;
using Sinacor.UI.Bovespa.ResumoFinanceiro.Communication.Bovespa.ManutencaoOrdens.Cliente;

namespace Sinacor.UI.Bovespa.ResumoFinanceiro.Communication
{
    public class Cliente : BaseCommunication
    {
        #region Atributos

        private ModelCollection<Model.Cliente> _cacheClientes = null;

        #endregion

        #region Construtor

        public Cliente(SessionInformation sessionInformation)
            : base(sessionInformation)
        {
            _cacheClientes = new ModelCollection<Model.Cliente>();
        }

        #endregion

        #region Metodos

        /// <summary>
        /// Aplicar cache conforme especificado no diagrama de atividade Cliente.
        /// ObterCliente()
        /// </summary>
        /// <param name="request"></param>
        public Model.Cliente ObterCliente(Model.Parameter.FiltroCliente model)
        {
            Model.Cliente retorno = null;
            ICliente servico = null;

            try
            {
                if (model.UtilizaCache)
                {
                    if (model.CodigoCliente.HasValue)
                        retorno = _cacheClientes.FirstOrDefault(x => x.Codigo.Value == model.CodigoCliente.Value);
                    else if (!String.IsNullOrEmpty(model.Apelido))
                        retorno = _cacheClientes.FirstOrDefault(x => x.Apelido == model.Apelido);
                }

                if (retorno == null)
                {
                    using (ServiceInstance<ICliente> service = new ServiceInstance<ICliente>())
                    {
                        servico = service.TryGetInstance(this.Session);

                        FiltroClienteRequest request =
                            new Translator.ModelToDataContract.Cliente().ToFiltroClienteRequest(model);

                        ClienteResponse clienteResponse = servico.ObterCliente(request);

                        retorno = new Translator.DataContractToModel.Cliente().ToCliente(clienteResponse);

                        if (model.UtilizaCache
                            && retorno != null)
                            _cacheClientes.Add(retorno);
                    }
                }
            }
            catch (Exception ex)
            {
                HandleFault(ex);
            }

            return retorno;
        }

        #endregion
    }
}
